iT邦幫忙

2021 iThome 鐵人賽

DAY 12
0
Modern Web

工作後才知道的後端 30 件小事系列 第 12

PHP Switch 細節:Loose Comparison

  • 分享至 

  • xImage
  •  
tags: 工作後才知道的後端30件小事

可以先思考一下以下的輸出的什麼?

<?php

$arr = [
  null,
  0,
  1,
  2,
  3,
  '',
  [],
  [1, 2, 3]
];

foreach ($arr as $value) {
  switch ($value) {
    case null:
      dump('this is null');
      break;
    case 0:
      dump('this is 0');
      break;
    case 1:
      dump('this is 1');
      break;
    case 2:
      dump('this is 2');
      break;
    case 3:
      dump('this is 3');
      break;
    case '':
      dump('this is empty string');
      break;
    case []:
      dump('this is []');
      break;
    case [1, 2, 3]:
      dump('this is [1, 2, 3]');
      break;
  }
}

輸出:

"this is null"
"this is null"
"this is 1"
"this is 2"
"this is 3"
"this is null"
"this is null"
"this is [1, 2, 3]"

可以發現居然有 4 個 null!原因是什麼呢?

因為 switch 是 loose comparison,也就是==,而非===
所以到第一個 case 時,$value == null為真時就會進去;而在 PHP,null0''[]null都為真,跟empty()有點像。

loose comparison 的相反是 strict comparsion

能不能讓 switch 做 strict comparsion?

答案是不行,但有一些 tricky 的做法

其他 loose comparsion

in_array()預設也是 loose comparsion,但可以透過輸入參數去讓他做 strict comparsion!

// loose comparsion
in_array($value, $arr);

// strict comparsion
in_array($value, $arr, true);

Reference


上一篇
Laravel Queue Job:深入理解 timeout 的運作
下一篇
PHP 亂數產生介於 0 到 1 之間的浮點數
系列文
工作後才知道的後端 30 件小事20
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言